package com.lovi.user.service.serviceImpl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lovi.constant.UserConstant;
import com.lovi.param.PageParam;
import com.lovi.param.UserCheckParams;
import com.lovi.param.UserLoginParams;
import com.lovi.user.mapper.UserMapper;
import com.lovi.pojo.User;
import com.lovi.user.service.UserService;
import com.lovi.utils.MD5Util;
import com.lovi.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Slf4j
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    //给注册用的，校验账号
    @Override
    public R checkUserAccount(UserCheckParams userCheckParams) {
        QueryWrapper wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name",userCheckParams.getUserName());
        User user = userMapper.selectOne(wrapper);
        if(user==null){
            log.info("UserServiceImpl.checkUserAccount 结果为->{}", "账号不存在,可以注册");

            return R.ok("账号不存在,可以注册");
        }
        log.info("UserServiceImpl.checkUserAccount 结果为->{}", "账号已经存在");
        return R.fail("账号已经存在");
    }

    /**
     * 用户注册，加密加盐
     * @param user
     */
    @Override
    public R register(User user) {
        //看数据库是否存在这个账户
        QueryWrapper wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name",user.getUserName());
        Long count = userMapper.selectCount(wrapper);
        if(count>0){
            log.info("UserServiceImpl.register 结果为->{}", "用户已存在，请登录！");
            return R.fail("用户已存在，请登录！");
        }
        //正常注册，加盐处理
        String newPwd = MD5Util.encode(user.getPassword()+ UserConstant.SALT);
        user.setPassword(newPwd);

        //插入数据库，显示注册成功
        int row = userMapper.insert(user);
        if(row>0){
            return R.ok("注册成功");
        }
        return R.fail("注册失败");

    }

    /**
     * 登录实现，返回值不能有密码（和校验配合，需要设置密码为null，则前端响应不显示密码）
     * @param userLoginParams
     * @return
     */
    @Override
    public R login(UserLoginParams userLoginParams) {
        //数据库比对
        QueryWrapper wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name",userLoginParams.getUserName());
        String newPwd = MD5Util.encode(userLoginParams.getPassword()+UserConstant.SALT);
        wrapper.eq("password",newPwd);
        User user = userMapper.selectOne(wrapper);
        if(user==null){
            log.info("UserServiceImpl.login 结果为->{}", "账号或者密码不正确");
            return R.fail("账号或者密码不正确",userLoginParams);
        }
        //设置密码为null
        user.setPassword(null);
        return R.ok("登录成功",user);
    }

    /**
     * 分页查询用户数据
     * @param pageParam
     * @return
     */
    @Override
    public R listPage(PageParam pageParam) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        IPage<User> iPage = new Page<>(pageParam.getCurrentPage(), pageParam.getPageSize());
        IPage<User> userIPage = userMapper.selectPage(iPage, wrapper);
        List<User> userList = userIPage.getRecords();
        long total = userIPage.getTotal();
        return R.ok("查询成功",userList,total);
    }

    @Override
    public R removeUser(Integer userId) {
        int i = this.userMapper.deleteById(userId);
        log.info("UserServiceImpl.removeUser 结果为->{}", i);

        return R.ok("删除成功");
    }

    /**
     * 数据修改
     * 如果密码为明文就得修改啦【也就是当前获得的密码和数据库不一致就需要修改】
     * 改手机号和登录密码
     * @param user
     * @return
     */
    @Override
    public R updateUser(User user) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id",user.getUserId());
        wrapper.eq("user_name",user.getUserName());
        User user2 = userMapper.selectOne(wrapper);

        //如果数据库密码和框框的密码不一致，我们就需要对密码修改并且对明文进行加密,然后修改数据库数据
        String newPwd ="";
        if(!user2.getPassword().equals(user.getPassword())){
             newPwd = MD5Util.encode(user.getPassword()+UserConstant.SALT);
             user2.setPassword(newPwd);
        }
        user2.setUserPhonenumber(user.getUserPhonenumber());
        //数据库修改操作
        int i = userMapper.updateById(user2);
        log.info("UserServiceImpl.updateUser 结果为->{}", i);

        return R.ok("修改成功");
    }

    @Override
    public R saveUser(User user) {
        //密码加盐，其他不变
        user.setPassword(MD5Util.encode(user.getPassword()+UserConstant.SALT));
        int insert = userMapper.insert(user);
        log.info("UserServiceImpl.saveUser 结果为->{}", insert);
        return R.ok("保存成功");
    }
}
